FATE Flow系统高可用的设计方案及实现
本期很荣幸为大家带来一篇微众银行的精彩投稿。本篇文章给我们带来了FATE Flow系统高可用的设计方案及实现相关内容。
文章由微众银行人工智能部研发工程师万志辉撰写,感谢微众银行及文章作者对社区的支持。以下是文章详细内容~
✦
✦
一、背景介绍
FATE Flow是基于共享状态调度架构和跨数据中心的多方安全通信,实现了端到端全流程的多方联合任务安全调度的联邦学习调度管理框架。经过了30+版本的迭代,FATE Flow已集调度(站点、任务)、管理(资源、数据、模型、指标、算法、权限)、多引擎适配(计算、存储、通信)于一体,并致力打造一个可靠和稳定的联邦学习调度管理框架。高可用(HA)作为现代系统架构的重要衡量指标,在即将发布的FATE Flow v1.9.0版本中也将被支持。
二、 高可用方案设计
调度是FATE Flow的主要功能之一,稳定可靠的调度能力对其来讲是至关重要的,也是高可用的设计的关键考虑因素。整体架构图如下:
其中nginx不仅可以让flow集群负载均衡,当某个flow出现故障时还会自动切换到其它健康实例来访问;zookeeper里会实时记录当前健康状态的flow实例,可供集群之间互相发现。除此之外,其它服务如db、cos(用于模型存储)、计算、存储、通信等服务在集群之间是共享的。
三、实现
在启动flow服务时,会将当前flow实例信息注册到zookeeper的临时节点里,实例信息包括实例id、启动时间、版本、grpc地址、http地址。例如:{"instance_id": "flow-105-9380", "timestamp": 1660639290695, "version": "1.9.0", "grpc_address": "x.x.x.x:9360", "http_address": "x.x.x.x:9380"}。停止flow服务时,对应的临时节点会被清理。上层应用可通过zookeeper来获取fate flow集群信息,此外flow也会提供接口获取整个集群的信息。
FATE flow的接口按状态划分,分为有状态和无状态。其中无状态接口就是调用公共服务的,如查db获取job(或task)信息、获取指标输出、数据(或模型)下载等,这类接口请求可由任何一个flow实例处理。对于有状态的接口,如kill、clean等,因为task是以python进程的方式启动在接收run task命令的实例上,须task运行所在实例去执行。flow给有状态的接口提供集群转发机制,任意实例收到请求后都会抛回给task进程所在的flow实例。
为了避免多实例并发调度同一任务导致不一致问题,新增了调度锁机制:调度锁为job级,调度器拿到调度锁意味着当前拥有此job的调度权,调度完成后会释放调度锁。未获取到锁的调度器会尝试去争夺其它job或状态的调取权,避免忙等待,提高系统整体调度能力。
在跑upload任务时,假设客户端上传数据到flow的实例A,若在运行时采用随机转发并且转发到没数据的实例B上,会导致无法完成上传操作而失败。因此,在初始化local任务的task时会同时记录当前机器的ip和port,以保证任意机器在收到组件运行命令时都可将请求抛回到创建该组件的机器实例上。
当某台flow实例宕机之前有task运行在其上时,其它flow实例会探测感知并stop该任务。把job的配置auto_retries设置为1(或大于1),系统会尝试在其它存活的flow实例上重跑此任务,以此提升系统可用性和稳定性。
由于调度的最小单位是task,对多组件的任务来说,其task可能被随机分发到各台flow实例上运行,任务日志也会遍布于多台机器上,查看起来较为麻烦。flow日志接口支持传实例id参数,通过实例id获取地址并做转发,即可达到通过一台机器访问整个集群机器的日志的效果。FATE board也做了相应的支持,可以选择查看集群里所有flow实例的日志。
和日志类似,由于模型是task的输出,多组件的任务中模型可能会保存到各台flow实例上,若没有一个公共存储介质,当需要使用时某台机器挂了就会导致整个模型不可用,对高可用来讲是较为致命的。因此,flow分别基于mysql和tencent_cos实现了模型公共存储,组件输出的模型都会上传至其中,当某台flow实例本地没有并且需要用到时,会去公共存储下载模型文件至本地。
四、其他补充
nginx默认配置下,如果某台FATE flow服务器宕机,它还是会留存在upstream负载集群里,这样会导致后面的请求依旧可能会转发到此服务器上,对性能来讲不是最佳的理想方案,可以通过nginx自带的模块ngx_http_proxy_module和ngx_http_upstream_module对flow节点做健康检测。
1.7.0版本之后FATE flow已经开始支持注册不同版本算法包,需要将算法包放到flow机器上,然后调用注册接口,具体可参考文档:https://federatedai.github.io/FATE-Flow/latest/zh/fate_flow_component_registry/#4
在集群环境下,1.9.0版本并未实现集群包分发功能,需要在每个flow实例机器相同路径下放上对应的算法包才可以注册成功。
【github直达】:阅读原文或复制链接https://github.com/FederatedAI/FATE即可,点击star,方便下次使用。
【社区征稿】
FATE(Federated AI Technology Enabler)开源社区是全球首个隐私计算联邦学习开源社区,拥有全球首个工业级安全联邦学习框架。同时FATE开源社区以“开源开放,共力创新”为愿景,汇聚更多开发者、行业专家、创新力量,共同推动联邦学习技术发展及应用实践。基于此,目前社区向广大行业从业者征稿,希望给行业从业者打造一个技术交流的平台,欢迎大家踊跃投稿(公众号后台留言或联系小助手)
END
1.精华合集 | 联邦学习 FATE 从入门到精通(建议收藏!!!)
2.资料合集 | 隐私计算行业规范、白皮书、研究报告等资料汇总(建议收藏!!)